//package org.jeecg.modules.deepseek.tools;
//
//import io.swagger.v3.oas.annotations.media.Schema;
//import lombok.extern.slf4j.Slf4j;
//import org.jeecg.modules.deepseek.service.NoteService;
//import org.neo4j.driver.Value;
//import org.neo4j.driver.types.Node;
//import org.neo4j.driver.types.Relationship;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Description;
//import org.springframework.data.neo4j.core.Neo4jClient;
//
//import java.util.*;
//import java.util.function.Function;
//import java.util.function.Supplier;
//import java.util.stream.Collectors;
//import java.util.stream.StreamSupport;
//
//@Slf4j
//@Configuration
//public class WebNeo4jTools {
//
//    @Autowired
//    private Neo4jClient neo4jClient;
//
//    public record NodeQuery(@Schema(description = "节点标签") String label,
//                            @Schema(description = "节点属性") Map<String, Object> properties) {
//    }
//
//    public record RelationshipQuery(@Schema(description = "起始节点ID") Long startNodeId,
//                                    @Schema(description = "结束节点ID") Long endNodeId,
//                                    @Schema(description = "关系类型") String relationshipType,
//                                    @Schema(description = "关系属性") Map<String, Object> properties) {
//    }
//
//    public record CypherQuery(@Schema(description = "Cypher查询语句") String cypher) {
//    }
//
//    @Bean
//    @Description("创建节点")
//    public Function<NodeQuery, Long> createNode() {
//        return request -> {
//            try {
//                String label = request.label();
//                Map<String, Object> properties = request.properties();
//
//                return neo4jClient.query(
//                                "CREATE (n:" + label + " $props) RETURN id(n) AS nodeId")
//                        .bind(properties).to("props")
//                        .fetchAs(Long.class)
//                        .one()
//                        .orElse(null);
//            } catch (Exception e) {
//                log.warn("创建节点失败: {}", e.getMessage());
//                return null;
//            }
//        };
//    }
//
//    @Bean
//    @Description("创建关系")
//    public Function<RelationshipQuery, Boolean> createRelationship() {
//        return request -> {
//            try {
//                String cypher = String.format(
//                        "MATCH (a), (b) WHERE id(a) = $startId AND id(b) = $endId " +
//                                "CREATE (a)-[r:%s $props]->(b) RETURN r",
//                        request.relationshipType());
//
//                neo4jClient.query(cypher)
//                        .bind(request.startNodeId()).to("startId")
//                        .bind(request.endNodeId()).to("endId")
//                        .bind(request.properties()).to("props")
//                        .fetch().one();
//                return true;
//            } catch (Exception e) {
//                log.warn("创建关系失败: {}", e.getMessage());
//                return false;
//            }
//        };
//    }
//
//    @Bean
//    @Description("执行Cypher查询")
//    public Function<CypherQuery, List<Map<String, Object>>> executeCypherQuery() {
//        return request -> {
//            try {
//                List list = neo4jClient.query(request.cypher())
//                        .fetchAs(List.class)
//                        .mappedBy((typeSystem, record) -> {
//                            List<Map<String, Object>> results = new ArrayList<>();
//                            Map<String, Object> row = new HashMap<>();
//
//                            record.fields().forEach(field -> {
//                                String key = field.key();
//                                Value value = field.value();
//
//                                if (value.type().name().equals("NODE")) {
//                                    Node node = value.asNode();
//                                    Map<String, Object> nodeMap = new HashMap<>();
//                                    nodeMap.put("nodeId", node.id());
//                                    nodeMap.put("labels", node.labels());
//                                    nodeMap.put("properties", node.asMap());
//                                    row.put(key, nodeMap);
//                                } else if (value.type().name().equals("RELATIONSHIP")) {
//                                    Relationship rel = value.asRelationship();
//                                    Map<String, Object> relMap = new HashMap<>();
//                                    relMap.put("relationshipId", rel.id());
//                                    relMap.put("type", rel.type());
//                                    relMap.put("properties", rel.asMap());
//                                    row.put(key, relMap);
//                                } else {
//                                    row.put(key, value.asObject());
//                                }
//                            });
//
//                            results.add(row);
//                            return results;
//                        })
//                        .one() // Get single list result
//                        .orElse(Collections.emptyList());
//                return list;
//            } catch (Exception e) {
//                log.warn("执行Cypher查询失败: {}", e.getMessage());
//                return null;
//            }
//        };
//    }
//
//    @Bean
//    @Description("搜索节点")
//    public Function<NodeQuery, List<Map<String, Object>>> searchNodes() {
//        return request -> {
//            try {
//                String label = request.label();
//                Map<String, Object> properties = request.properties() != null ?
//                        request.properties() : Collections.emptyMap();
//
//                // Build the Cypher query
//                StringBuilder cypher = new StringBuilder("MATCH (n");
//                if (label != null && !label.isEmpty()) {
//                    cypher.append(":").append(label);
//                }
//                cypher.append(")");
//
//                if (!properties.isEmpty()) {
//                    cypher.append(" WHERE ");
//                    List<String> conditions = properties.entrySet().stream()
//                            .map(entry -> "n." + entry.getKey() + " = $" + entry.getKey())
//                            .collect(Collectors.toList());
//                    cypher.append(String.join(" AND ", conditions));
//                }
//                cypher.append(" RETURN n");
//
//                // Execute query and map results
//                return neo4jClient.query(cypher.toString())
//                        .bindAll(properties)
//                        .fetch()
//                        .all()
//                        .stream()
//                        .map(record -> {
//                            Node node = (Node) record.get("n"); // 注意这里返回的是 org.neo4j.driver.types.Node
//                            Map<String, Object> nodeMap = new LinkedHashMap<>();
//
//                            nodeMap.put("id", node.id());
//
//                            List<String> labels = StreamSupport.stream(node.labels().spliterator(), false)
//                                    .collect(Collectors.toList());
//                            nodeMap.put("labels", labels);
//
//                            nodeMap.putAll(node.asMap());
//
//                            return nodeMap;
//                        })
//                        .collect(Collectors.toList());
//
//            } catch (Exception e) {
//                log.warn("搜索节点失败: {}", e.getMessage());
//                return Collections.emptyList();
//            }
//        };
//    }
//
//    @Bean
//    @Description("删除节点")
//    public Function<Long, Boolean> deleteNode() {
//        return nodeId -> {
//            try {
//                neo4jClient.query("MATCH (n) WHERE id(n) = $id DETACH DELETE n")
//                        .bind(nodeId).to("id")
//                        .run();
//                return true;
//            } catch (Exception e) {
//                log.warn("删除节点失败: {}", e.getMessage());
//                return false;
//            }
//        };
//    }
//
//    @Bean
//    @Description("删除关系")
//    public Function<Long, Boolean> deleteRelationship() {
//        return relationshipId -> {
//            try {
//                neo4jClient.query("MATCH ()-[r]-() WHERE id(r) = $id DELETE r")
//                        .bind(relationshipId).to("id")
//                        .run();
//                return true;
//            } catch (Exception e) {
//                log.warn("删除关系失败: {}", e.getMessage());
//                return false;
//            }
//        };
//    }
//
//    @Bean
//    @Description("获取整个图谱")
//    public Supplier<List<Map<String, Object>>> getWholeGraph() {
//        return () -> {
//            try {
//                return neo4jClient.query("MATCH (n)-[r]->(m) RETURN n, r, m")
//                        .fetch()
//                        .all()
//                        .stream()
//                        .map(record -> {
//                            Map<String, Object> result = new HashMap<>();
//
//                            Node startNode = (Node) record.get("n");
//                            Node endNode = (Node) record.get("m");
//                            Relationship relationship = (Relationship) record.get("r");
//
//                            result.put("startNode", mapNode(startNode));
//                            result.put("endNode", mapNode(endNode));
//                            result.put("relationship", mapRelationship(relationship));
//                            return result;
//                        })
//                        .collect(Collectors.toList());
//            } catch (Exception e) {
//                log.warn("获取图谱失败: {}", e.getMessage());
//                return Collections.emptyList();
//            }
//        };
//    }
//
//
//    private Map<String, Object> mapNode(Node node) {
//        Map<String, Object> nodeMap = new HashMap<>();
//        nodeMap.put("nodeId", node.id());
//        nodeMap.put("labels", node.labels());
//        nodeMap.put("properties", node.asMap());
//        return nodeMap;
//    }
//
//    private Map<String, Object> mapRelationship(Relationship relationship) {
//        Map<String, Object> relMap = new HashMap<>();
//        relMap.put("relationshipId", relationship.id());
//        relMap.put("type", relationship.type());
//        relMap.put("properties", relationship.asMap());
//        return relMap;
//    }
//}
